window.onload = function () {
  // this指向规则
  // 运行函数时，看有没有调用者
  // 无调用者 this指向的是window  严格模式下 Undefined
  // 有调用者 指向调用者
  // fn(); //无调用者
  // obj.fn(); //有调用者
  //情况一：
  var length = 1;
  function fn() {
    console.log(this.length, "length"); // this.length === window.length
  }

  fn(); // 1
  //情况二
  var length = 1;
  function fn() {
    console.log(this.length, "length"); // this.length === window.length
  }

  var obj = {
    length: 100,
    f1: fn,
  };
  // obj.f1(); // fn() 100
  var x = obj.f1;
  x(); //无调用者
  //   情况三:
  var length = 1;
  function fn() {
    console.log(this.length); // this.length === lists.length
  }
  var lists = [fn, 2, 3, 4, 5, 6];
  lists[0](); // 6
  var f = lists[0];
  f(); // 1

  //arguments 所有的参数集合 类数组
  function fn2() {
    console.log(arguments); // arguments = 类数组 != [1, 2, 3, 4, 5, 6]
  }
  fn2(1, 2, 3, 4, 5, 6);

  //阿里面试题
  var length = 1;
  function fn() {
    console.log(this.length); // fn() 执行无调用者
  }
  var obj = {
    length: 100,
    action: function (callback) {
      callback(); //  callback() == fn()               第一步
      arguments[0](); // 3. arguments[0]() ==  fn()   第三步
      // this.length == arguments.length               第五步
    },
  };

  var arr = [1, 2, 3, 4];
  obj.action(fn, ...arr); // arguments[0] == fn         第二步
  // (fn,...arr)  属于参数  == arguments                第四步
  

  //考核点：this指向 arguments es6扩展运算符...
};
